package bean;

import java.util.ArrayList;
import java.util.List;

import javax.faces.application.FacesMessage;
import javax.faces.bean.ManagedBean;
import javax.faces.bean.SessionScoped;
import javax.faces.context.FacesContext;
import javax.faces.event.ActionEvent;
import javax.faces.model.DataModel;
import javax.faces.model.ListDataModel;
import javax.faces.model.SelectItem;

import br.com.kapa.dao.DaoMateriaPrimaBeanRemote;
import br.com.kapa.dao.DaoProdutoBeanRemote;
import br.com.kapa.dao.DaoUnidadeBeanRemote;
import br.com.kapa.model.MateriaPrima;
import br.com.kapa.model.Produto;
import br.com.kapa.model.Unidade;
import fachada.Fachada;

@ManagedBean
@SessionScoped
public class ProdutoBean {

	private Produto produto;
	private DataModel<Produto> produtos;
	private DaoProdutoBeanRemote dao;
	private Fachada fachada = Fachada.getInstance();
	// selects
	private int unidadeSelecionada;
	private List<SelectItem> listaUnidades;
	private int insumoSelecionado;
	private List<SelectItem> listaInsumos;
	private double quantidade;

	public Produto getProduto() {
		return produto;
	}

	public void setProduto(Produto u) {
		produto = u;
	}

	public int getUnidadeSelecionada() {
		return unidadeSelecionada;
	}

	public void setUnidadeSelecionada(int u) {
		unidadeSelecionada = u;
	}

	public int getInsumoSelecionado() {
		return insumoSelecionado;
	}

	public void setInsumoSelecionado(int i) {
		insumoSelecionado = i;
	}

	public double getQuantidade() {
		return quantidade;
	}

	public void setQuantidade(double q) {
		quantidade = q;
	}

	public void setListaUnidades(List<SelectItem> lista) {
		listaUnidades = lista;
	}

	public void setListaInsumos(List<SelectItem> lista) {
		listaInsumos = lista;
	}

	public ProdutoBean() {
		dao = fachada.getDaoProduto();
	}

	public List<SelectItem> getListaUnidades() {
		listaUnidades = getLista();
		return listaUnidades;
	}

	public List<SelectItem> getListaInsumos() {
		listaInsumos = getListaMateriaPrima();
		return listaInsumos;
	}

	public List<SelectItem> getLista() {
		ArrayList<SelectItem> lista = new ArrayList<SelectItem>();
		DaoUnidadeBeanRemote unidadeDao = fachada.getDaoUnidade();
		List<Unidade> resultado = unidadeDao.findAll();

		for (Unidade teste : resultado) {
			SelectItem item = new SelectItem(teste.getId(), teste.getNome());
			lista.add(item);
		}
		return lista;
	}

	public List<SelectItem> getListaMateriaPrima() {
		ArrayList<SelectItem> lista = new ArrayList<SelectItem>();
		DaoMateriaPrimaBeanRemote dao = fachada.getDaoMateriaPrima();
		List<MateriaPrima> resultado = dao.findAll();

		for (MateriaPrima teste : resultado) {
			SelectItem item = new SelectItem(teste.getId(),
					teste.getDescricao());
			lista.add(item);
		}
		return lista;
	}

	public DataModel<Produto> getProdutos() {
		List<Produto> lista = dao.findAll();
		produtos = new ListDataModel<Produto>(lista);
		return produtos;
	}

	public void salvar() {
		Unidade u = fachada.getDaoUnidade().find(getUnidadeSelecionada());
		produto.setUnidade(u);
		FacesContext fc = FacesContext.getCurrentInstance();
		dao.persist(produto);
		fc.addMessage(null, new FacesMessage("Cadastro efetuado com sucesso",
				produto.getDescricao()));
		
		fachada.sendMessageToLog("Salvando produto", produto.getDescricao()); 
	}

	public void load(ActionEvent e) {
		produto = (Produto) (produtos.getRowData());
		if (produto.getUnidade() != null)
			setUnidadeSelecionada(produto.getUnidade().getId());
	}

	public void create(ActionEvent e) {
		produto = new Produto();
	}

	public void update(ActionEvent e) {
		
		Unidade u = fachada.getDaoUnidade().find(getUnidadeSelecionada());
		produto.setUnidade(u);
		FacesContext fc = FacesContext.getCurrentInstance();
		dao.merge(produto);
		fc.addMessage(null, new FacesMessage("Cadastro alterado com sucesso",
				produto.getDescricao()));
	}

	public void adicionarInsumo(ActionEvent e) {
		System.out.println("adicionando o insumo");
		DaoMateriaPrimaBeanRemote dao = fachada.getDaoMateriaPrima(); 
		MateriaPrima materia = dao.find(getInsumoSelecionado());
		if (materia != null) {
			getProduto().addInsumo(materia, getQuantidade());
		}
		System.out.println("adicionado.");
	}

}
